import java.util.Arrays;

public class Test {
    /**
     * 【顺时针打印矩阵】
     * 对于一个矩阵，请设计一个算法从左上角(mat[0][0])开始，顺时针打印矩阵元素。
     * 给定int矩阵mat,以及它的维数nxm，请返回一个数组，数组中的元素为矩阵元素的顺时针输出。
     * 输入：[[1,2],[3,4]],2,2
     * 返回：[1,2,4,3]
     * @return
     */
    public static int [] clockwisePrint(int[][] mat, int n, int m){
        //左上角坐标
        int x1 = 0;
        int y1 = 0;
        //右下角坐标
        int x2 = n-1;
        int y2 = m-1;
        int arr[] = new int[n * m];
        int id = 0;
        while(x1 <= x2 && y1 <= y2) {
            //第一行坐标
            for (int i = y1; i <= y2; i++) {
                arr[id++] = mat[x1][i];
            }
            //最后一列
            for (int i = x1 + 1; i <= x2; i++) {
                arr[id++] = mat[i][y2];
            }
            //最后一行，加一个限制条件，保证最少有两行
            if (x1 < x2) {
                for (int i = y2 - 1; i >= y1; i--) {
                    arr[id++] = mat[x2][i];
                }
            }
            //第一列坐标，同样加一个限制条件，保证最少有两列
            if (y1 < y2) {
                for (int i = x2 - 1; i > x1; i--) {
                    arr[id++] = mat[i][y1];
                }
            }
            x1++;
            y1++;
            x2--;
            y2--;
        }
        return arr;
    }
    public static void main(String[] args) {
        int[][] arr = {{1,2},{3,4}};
        int n = 2;
        int m = 2;
        System.out.println(Arrays.toString(clockwisePrint(arr,n,m)));
    }
}
